home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-04
/
netprog.zip
/
NETPROG.TAR
/
net.s5
/
acceptcall.c
next >
Wrap
C/C++ Source or Header
|
1989-12-17
|
2KB
|
79 lines
/*
* Accept an incoming connection request.
*
* Return the new descriptor that refers to the newly accepted connection,
* or -1. The only time we return -1 is if a disconnect arrives before
* the accept is performed.
*/
#include <stdio.h>
#include <tiuser.h>
#include <fcntl.h>
#include <stropts.h>
int
accept_call(listenfd, callptr, name, rwflag)
int listenfd; /* the descriptor caller used for t_listen() */
struct t_call *callptr; /* from t_listen(), passed to t_accept() */
char *name; /* name of transport provider */
int rwflag; /* if nonzero, push read/write module */
{
int newfd;
extern int t_errno;
/*
* Open the transport provider to get a new file descriptor.
*/
if ( (newfd = t_open(name, O_RDWR, (struct t_info *) 0)) < 0)
err_sys("t_open error");
/*
* Bind any local address to the new descriptor. Since this
* function is intended to be called by a server after a
* connection request has arrived, any local address will suffice.
*/
if (t_bind(newfd, (struct t_bind *) 0, (struct t_bind *) 0) < 0)
err_sys("t_bind error");
/*
* Accept the connection request on the new descriptor.
*/
if (t_accept(listenfd, newfd, callptr) < 0) {
if (t_errno == TLOOK) {
/*
* An asynchronous event has occurred. We must have
* received a disconnect. Go ahead and call t_rcvdis(),
* then close the new file descriptor that we opened
* above.
*/
if (t_rcvdis(listenfd, (struct t_discon *) 0) < 0)
err_sys("t_rcvdis error");
if (t_close(newfd) < 0)
err_sys("t_close error");
return(-1); /* return error to caller */
}
err_sys("t_accept error");
}
/*
* If the caller requests, push the streams module "tirdwr" onto
* the new stream, so that the read(2) and write(2) system calls
* can be used. We first have to pop the "timod" module (the
* default).
*/
if (rwflag) {
if (ioctl(newfd, I_POP, (char *) 0) < 0)
err_dump("I_POP of timod failed");
if (ioctl(newfd, I_PUSH, "tirdwr") < 0)
err_dump("I_PUSH of tirdwr failed");
}
return(newfd);
}